/**
 * 子线程:收主线程消息
 * @param back function|null 回调 back(k,v,re)
 * 		- null: 仅初始化,  多次!null调用:报错
 * 		k:string 非_开头, v:mixed 收到解析消息
 * 			_data: 非约定{k,v}格式消息, v=原值
 * 		re: string|null 反馈KEY  null:不需反馈
 * 			if(re)必须: this.send(re, 反馈值)
 * @param ign boolean 是否忽略非子线程 false:报错
 * @return boolean 是否子线程  true:是
 */
$.worker = function(back=null, ign=false){
	const $W=require('node:worker_threads');  let B;
	Object.defineProperty($,'__workerPost',{value:{}});
	const T=$.__workerPost, SUB=!$W.isMainThread;
	SUB && $W.parentPort.on('message', v=>{
		let k = v && typeof v==='object' && v.k;
		if(k) v=v.v; else k='_data'; let p=k.slice(0,9);
		if(p==='$worker.S'){ // 反馈消息(收到)
			T[k].call(null,v);  delete T[k];  return;
		}
		if(p!=='$worker.M') return B && B(k,v,null);//不需反馈
		if(!B) $.err('$.worker.back'); // 需要反馈, 必须有回调
		B(k.split('#').slice(1).join('#'), v, k); // 需要反馈
	});
	$.worker = function(back, ign=false){
		if(back){ if(B) $.err('$.worker.already'); B=back; }
		if(!SUB && !ign) $.err('$.worker.main'); return SUB;
	};
	return $.worker(back, ign);
};
// 子线程:收主线程启动数据 workerData
$.worker.data=require('node:worker_threads').workerData;
